from django.http import HttpResponse
from django.http import JsonResponse
from django.shortcuts import render

# Create your views here.

from django.views import View

from apps.verifications.constants import SMS_CODE_EXPIRES_SECONDS
from libs.captcha.captcha import captcha

from django_redis import get_redis_connection

from libs.yuntongxun.sms import CCP
from utils.response_code import RETCODE


class ImageCodeView(View):
    #图形验证码
    def get(self,request,uuid):
        '''

        :param request: 请求对象
        :param uuid:    唯一标识图形验证码所属于的用户
        :return:    image/jepg
        '''
        # 生成图片验证码
        # generate_captcha()会帮我们生成图片验证码，
        # 可以点进去看看，所以我们需要用两个变量来接收
        # text 是生成图片验证码的内容
        # image就是图片二进制
        text,image = captcha.generate_captcha()

        # 保存图片验证码
        redis_conn = get_redis_connection("code")
        # setex是设置键及其时间

        # img_%s是加的前缀
        redis_conn.setex("img_%s" % uuid, 120,text)

        # ④ 返回图片
        # return HttpResponse(image)
        # content_type
        # MIME类型
        # 大类/小类
        # application/json
        # text/html
        # image/jpeg
        # content_type 告诉服务器数据类型，如果不写就会以文本的形式出现，就是乱码
        return HttpResponse(image,content_type="image/jpeg")


from django.http import HttpResponseBadRequest
class SmsCodeView(View):
    def get(self,request,mobile):

        # ① 获取数据
        # mobile
        # 用户输入的验证码： image_code
        # uuid：         image_code_id
        image_code = request.GET.get("image_code")
        image_code_id = request.GET.get("image_code_id")


        # ② 验证数据
        if not all([image_code,image_code_id]):
            return HttpResponseBadRequest("参数不全")

        # 省略用户验证码长度验证
        # 省略 image_code_id的正则验证


        # ③ 比对用户输入的验证码和redis的验证码是否一致
        # 3.1链接redis
        from django_redis import get_redis_connection
        redis_coon = get_redis_connection("code")

        # 3.2获取指定的数据
        redis_text = redis_coon.get("img_%s"%image_code_id)

        if redis_text is None:
            return HttpResponseBadRequest("图片验证码已失效")

        # 3.3比对
        if redis_text.decode().lower() != image_code.lower():
            return HttpResponseBadRequest("图片验证码不一致")

        send_flag = redis_coon.get("send_flag_%s"%mobile)
        if send_flag:
            return JsonResponse({"errmsg":"短信发送太频繁","code":"4001"})

        # ④ 生成一个随机短信验证码
        # 6位数值
        from random import randint
        sms_code = "%06d" %randint(0,999999)

        # ⑤ 保存短信验证码
        # SMS_CODE_EXPIRES_SECONDS = 300
        redis_coon.setex("sms_%s"%mobile,SMS_CODE_EXPIRES_SECONDS,sms_code)

        # 添加一个标记
        redis_coon.setex("send_flag_%s"%mobile,60,1)


        # ⑥ 发送短信
        # ②免费开发测试使用的模板ID为1，形式为：【云通讯】您使用的是云通讯短信模板，
        # 您的验证码是{1}，请于{2}分钟内正确输入。其中{1}
        # 和{2}为短信模板的参数。
        # CCP().send_template_sms(mobile,[sms_code,5],1)

        from celery_tasks.sms.tasks import send_sms_code
        # 任务函数 平移到 delay中
        # delay 中 添加函数的参数
        send_sms_code.delay(mobile,sms_code)

        # ⑦ 返回相应

        return JsonResponse({"msg":"ok","code":RETCODE.OK})






























